package com.itheima.tilas.controller;

import com.itheima.tilas.Utils.ResultUtil;
import com.itheima.tilas.annotation.Log;
import com.itheima.tilas.dto.SelectEmpDetailDTO;
import com.itheima.tilas.entity.Emp;
import com.itheima.tilas.po.InsertEmpOneParam;
import com.itheima.tilas.po.SelectEmpPageParam;
import com.itheima.tilas.po.UpdateEmpOneParam;
import com.itheima.tilas.service.impl.EmpServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * DI: 从ioc容器中获取已经创建好的对象给属性(成员变量)赋值
 * 给给一个类的属性(成员变量)赋值  有几种方式 :  四种 :
 * 1. 直接等于赋值
 * 2. 构造器
 * 3. set方法赋值
 * 4. 反射
 * @Autowored 一般使用在构造器赋值和set方法赋值时
 * 所以说SpringDI注入有三种方式
 * 字段(属性)DI ->@Resource
 * 构造器DI     ->@Autowired
 * set方法DI   ->@autowired
 *
 * @Resource 与 @Autowired使用:
 * 如果一个springBean类中值需要注入很少的Bean对象 ->优先使用@Resource
 * 如果一个springBean类中值需要注入很多的Bean对象 ->优先使用@Autowired ->可以基于lombok实现构造器注入  加 @AllArgsConstructor 实现
 *
 * @author 132
 */
@RestController
@RequestMapping("/emps")
@CrossOrigin
public class EmpController {
    @Resource
    EmpServiceImpl empService;

    @GetMapping
    public ResultUtil selectEmpPageAll(SelectEmpPageParam pageParam) {
        if (Objects.isNull(pageParam.getPage()) || Objects.isNull(pageParam.getPageSize())) {
            return ResultUtil.fail("分页参数不存在");
        }
        return empService.selectEmpPageAll(pageParam);
    }

    @PostMapping
    @Log
    public ResultUtil insertEmpOne(@Validated @RequestBody InsertEmpOneParam param) {
        param.setCreateTime(LocalDateTime.now());
        param.setUpdatedTime(LocalDateTime.now());
        int flag = empService.insertEmpOne(param);
        return flag > 0 ? ResultUtil.success("成功插入" + flag + "条信息") : ResultUtil.fail();
    }

    @DeleteMapping
    @Log
    public ResultUtil deleteEmpByIds(@RequestParam List<Integer> ids) {
        if(ids.isEmpty()){
            return ResultUtil.fail("未传人id数据信息");
        }
        int flag = empService.deleteEmpByIds(ids);
        return flag > 0 ? ResultUtil.success("成功删除" + flag + "条信息") : ResultUtil.fail();

    }

    @GetMapping("/{id}")
    public ResultUtil selectById(@PathVariable("id") Integer id) {
        SelectEmpDetailDTO dto = empService.selectEmpById(id);
        if (Objects.nonNull(dto)) {
            return ResultUtil.success("查询成功", dto);
        } else {
            return ResultUtil.fail("查询失败");
        }
    }

    @PutMapping()
    @Log
    public ResultUtil updateEmpById(@Validated @RequestBody UpdateEmpOneParam emp) {
        emp.setUpdatedTime(LocalDateTime.now());
        int flag = empService.updateEmpOne(emp);
        return flag > 0 ? ResultUtil.success("修改成功") : ResultUtil.fail("修改失败");
    }

    @GetMapping("/list")
    public ResultUtil selectEmpAll() {
        List<Emp> emps = empService.selectEmpAll();
        if (Objects.nonNull(emps)) {
            return ResultUtil.success("查询到" + emps.size() + "条信息",emps);
        } else {
            return ResultUtil.fail("查询失败");
        }
    }
}





















